package com.homelink.crashhandle.util;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
import com.callrecorder.android.Constants;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Fcy on 2015/11/3.
 */
public class FileUtils2
{
	/**
	 * /mnt/sdcard/android/data/com.xxx.xxx/files/dir
	 *
	 * @param context
	 * @param dir
	 *            文件夹名
	 * @return 外部File路径，如果sd卡不存在，返回null，如果dir=null，返回files目录
	 */
	public static File getDiskFilesDir(Context context, String dir)
	{
		File file;
		if (!Environment.MEDIA_MOUNTED
		        .equals(Environment.getExternalStorageState()))
		{
			return null;
		}

		file = context.getExternalFilesDir(null);
		if (dir == null)
		{
			return file;
		}

		File fileDir = new File(file, dir);
		if (!fileDir.exists())
		{
			fileDir.mkdir();
		}
		return fileDir;
	}

	/**
	 * 获取sd卡根目录
	 *
	 * @return
	 */
	public static File getSdRoot()
	{
		if (!Environment.MEDIA_MOUNTED
		        .equals(Environment.getExternalStorageState()))
			return null;
		return Environment.getExternalStorageDirectory();
	}

	public static String getSdRootPath()
	{
		return getSdRoot() == null ? null : getSdRoot().getAbsolutePath();
	}

	/**
	 * 获取root目录下的所有后缀名为name的字段
	 * 
	 * @param root
	 *            文件根目录
	 * @param name
	 *            文件后缀名 .zip等，加上.
	 * @return
	 */
	public static void getAllFiles(List<File> list, File root, String name)
	{
		File files[] = root.listFiles();
		if (files != null)
		{
			for (File f : files)
			{
				if (f.isDirectory())
				{
					getAllFiles(list, f, name);
				}
				else
				{
					if (f.getName().endsWith(name))
					{
						list.add(f);
					}
				}
			}
		}
	}

	/**
	 * 删除 dir目录下的所有文件
	 *
	 * @param dir
	 * @return 是否删除成功
	 */
	public static boolean deleteContents(File dir)
	{
		File[] files = dir.listFiles();
		boolean success = true;
		if (files != null)
		{
			for (File file : files)
			{
				if (file.isDirectory())
				{
					success &= deleteContents(file);
				}
				if (!file.delete())
				{
					Log.e("FileUtils2", "Failed to delete " + file);
					success = false;
				}
			}
		}
		return success;
	}

	public static File getLogDir()
	{
		if (getSdRoot() == null)
			return null;
		File file = new File(getSdRoot(), ConstantsUtils.LOG_DIR_ROOT_NAME);
		if (file.exists() && file.isDirectory())
		{
			return file;
		}
		return null;
	}

	/**
	 * 获取对应包名下的log文件目录（该目录下包括logs, zip, split）
	 * 
	 * @param context
	 * @return
	 */
	public static File getPackageLogDir(Context context)
	{
		if (getSdRoot() == null)
			return null;
		return new File(getLogZipDirFile(context), context.getPackageName());
	}

	public static File getLogZipDirFile(Context context)
	{
		if (getSdRoot() == null)
			return null;
		File file = new File(getLogZipDir(context));
		if (!file.exists())
			return null;
		return file;
	}

	/**
	 * @param context
	 * @return 对应包名log日志zip包所在目录
	 */
	public static String getLogZipDir(Context context)
	{
		if (getSdRoot() == null)
			return null;

		return getSdRootPath() + File.separator + "homelink_logs"
		        + File.separator + context.getPackageName() + File.separator
		        + "zip";
	}

	/**
	 * 获取切片目录
	 * 
	 * @param context
	 * @return
	 */
	public static String getLogSplitDir(Context context)
	{
		if (getSdRoot() == null)
			return null;

		return getSdRootPath() + File.separator + "homelink_logs"
		        + File.separator + context.getPackageName() + File.separator
		        + "split";
	}

	public static File getLogSplitDirFile(Context context)
	{
		if (getSdRoot() == null)
			return null;
		File file = new File(getLogSplitDir(context));
		if (!file.exists())
		{
			file.mkdirs();
		}
		return file;
	}

	/**
	 * 根据类型获取上传文件 sd/homelink_logs/packageName/zip/下的所有文件
	 * 上传成功后需要删除该目录下的文件，为了避免已经上传的文件，再次上传
	 *
	 * @return
	 */
	public static List<File> getCrashFiles(Context context, boolean isCrash)
	{
		if (getLogZipDir(context) == null)
			return null;

		List<File> fileList = new ArrayList<File>();
		if (isCrash)
		{
			String zipPath = getLogZipDir(context);
			File file = new File(zipPath);
			if (file.exists() && file.isDirectory())
			{
				File[] files = file.listFiles();
				for (File file1 : files)
				{
					if (file1.isFile())
					{
						fileList.add(file1);
					}
				}
			}
		}
		else
		{ // 将homelink_logs下的所有文件夹中的logs文件下的文件都zip到zip文件夹下（并删除logs下的文件）
		  // sd/homelink_logs/
		  // File logDir = getLogDir();
		  // if (logDir != null)
		  // {
		  // File[] dir = logDir.listFiles();
		  // // 获取每一个dir下的zip文件夹下的，添加到fileList中
		  // for (File file : dir)
		  // {
		  // // org.jaaksi.test
		  // File zipDir = new File(file, "zip");
		  // // 遍历zip下的所有文件
		  // File[] files = zipDir.listFiles();
		  // for (File zipFile : files)
		  // {
		  // fileList.add(zipFile);
		  // }
		  // }
		  //
		  // }

			FileUtils2.getAllFiles(fileList, FileUtils2.getLogDir(), ".zip");

		}

		return fileList;
	}

	/**
	 * 切分文件
	 *
	 * @param file
	 *            被切分的文件
	 * @param path
	 *            切分后的文件的所在路径 /切片
	 * @param size
	 *            分片的大小
	 */
	public static void splitFile(File file, String path, long size)
	{
		if (file != null)
		{
			if (size < 0)
				size = 512; // UploadResponseHandler.BUFFER_SIZE
			int mTotalCnt = (int) (file.length() / size) + 1;
			Log.d(Constants.TAG, "file count " + mTotalCnt);
			long mPosOffset = 0;
			long length = 0;
			RandomAccessFile randomAccessFile = null;
			FileOutputStream outputStream = null;
			byte[] buffer = new byte[1024];
			// byte[] buffer = new byte[UploadResponseHandler.BUFFER_SIZE];
			for (int i = 0; i < mTotalCnt; i++)
			{
				// renameFile(mCallStartTime + "", phoneNumber + "_"
				// + mDirection + "_" + mCallStartTime + "_" + mCallEndTime
				// + "_" + mTotalCnt + "_" + i);
				try
				{
					// 指向的文件 原文件名_6_1;
					// TODO 切分后的文件放在哪里
					// file.getAbsolutePath() +
					outputStream = new FileOutputStream(path + File.separator
					        + file.getName() + "_" + mTotalCnt + "_" + i);
				} catch (FileNotFoundException e)
				{
					e.printStackTrace();
				}

				try
				{
					randomAccessFile = new RandomAccessFile(file, "r");
					randomAccessFile.seek(mPosOffset);
				} catch (FileNotFoundException e)
				{
					if (randomAccessFile != null)
					{
						try
						{
							randomAccessFile.close();
						} catch (IOException e1)
						{
						}
					}
					return;
				} catch (IOException e)
				{
					if (randomAccessFile != null)
					{
						try
						{
							randomAccessFile.close();
						} catch (IOException e1)
						{
						}
					}
					return;
				}

				try
				{
					// 从文件中读内容
					length = randomAccessFile.read(buffer);
				} catch (IOException e)
				{
					if (randomAccessFile != null)
					{
						try
						{
							randomAccessFile.close();
						} catch (IOException e1)
						{
						}
					}
					return;
				}

				try
				{
					outputStream.write(buffer, 0, (int) length);
				} catch (IOException e)
				{

					if (randomAccessFile != null)
					{
						try
						{
							randomAccessFile.close();
						} catch (IOException e1)
						{
						}
					}
					return;
				}
				mPosOffset += length;

			}
			// TODO 删除原来的zip文件
//			file.delete();
		}

	}
}
